package com.kylin.domain.user.vo;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.kylin.shared.common.ValueObject;
import com.kylin.shared.common.consts.Constants;
import com.kylin.shared.enums.ResultCodeEnum;
import com.kylin.shared.exception.BusinessException;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Objects;

/**
 * @author Damon S.
 * @version v1.0.1
 * @date 2020年11月08日 16:42
 */
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor
public final class WechatUserInfoVO implements ValueObject {
    // 记录ID
    private String id;

    /** 手机号 */
    private String phoneNumber;

    // 用户ID
    private String userId;

    /**普通用户的标识，对当前开发者帐号唯一*/
    private String openId;

    /** 普通用户昵称*/
    private String nickName;

    /** 语言 */
    private String language;

    /** 普通用户性别，1为男性，2为女性 */
    private Integer gender;

    /** 普通用户个人资料填写的省份 */
    private String province;

    /**普通用户个人资料填写的城市 */
    private String city;

    /*** 国家，如中国为CN*/
    private String country;

    /** 用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空*/
    private String avatarUrl;

    /** 用户特权信息，json数组，如微信沃卡用户为（chinaunicom）*/
    private List<String> privileges;

    /**用户统一标识。针对一个微信开放平台帐号下的应用，同一用户的unionid是唯一的。*/
    private String unionId;

    private String token;

    public static final WechatUserInfoVO EMPTY = new WechatUserInfoVO(Constants.STR_EMPTY);
    private static final ObjectMapper MAPPER = new ObjectMapper();

    private WechatUserInfoVO(String userId) {
        this.setUserId(userId);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        WechatUserInfoVO info = null;
        if (obj instanceof WechatUserInfoVO) {
            info = (WechatUserInfoVO) obj;
        }
        return Objects.nonNull(info)
                && Objects.equals(info.getPhoneNumber(), this.getPhoneNumber())
                && Objects.equals(info.getUserId(), this.getUserId())
                && Objects.equals(info.getOpenId(), this.getOpenId())
                && Objects.equals(info.getUnionId(), this.getUnionId());
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    public static WechatUserInfoVO parse(String raw) {
        WechatUserInfoVO userInfoVO;
        try {
            userInfoVO = MAPPER.readValue(
                    raw, WechatUserInfoVO.class
            );
        } catch (Exception e) {
            throw new BusinessException(ResultCodeEnum.BIZ_ERROR);
        }
        return userInfoVO;
    }

    @Override
    public String toString() {
        String jsonStr;
        try {
            jsonStr = MAPPER.writeValueAsString(this);
        } catch (Exception e) {
            throw new BusinessException(ResultCodeEnum.BIZ_ERROR);
        }
        return jsonStr;
    }
}